// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_BASE_COCOA_ANIMATION_UTILS_H
#define UI_BASE_COCOA_ANIMATION_UTILS_H

#import <Cocoa/Cocoa.h>
#import <QuartzCore/QuartzCore.h>

// This class is a stack-based helper useful for unit testing of Cocoa UI,
// and any other situation where you want to temporarily turn off Cocoa
// animation for the life of a function call or other limited scope.
// Just declare one of these, and all animations will complete instantly until
// this goes out of scope and pops our state off the Core Animation stack.
//
// Example:
//  MyUnitTest() {
//    WithNoAnimation at_all; // Turn off Cocoa auto animation in this scope.

class WithNoAnimation {
public:
    WithNoAnimation()
    {
        [NSAnimationContext beginGrouping];
        [[NSAnimationContext currentContext] setDuration:0.0];
    }

    ~WithNoAnimation()
    {
        [NSAnimationContext endGrouping];
    }
};

// Disables actions within a scope.
class ScopedCAActionDisabler {
public:
    ScopedCAActionDisabler()
    {
        [CATransaction begin];
        [CATransaction setValue:[NSNumber numberWithBool:YES]
                         forKey:kCATransactionDisableActions];
    }

    ~ScopedCAActionDisabler()
    {
        [CATransaction commit];
    }
};

// Sets a duration on actions within a scope.
class ScopedCAActionSetDuration {
public:
    explicit ScopedCAActionSetDuration(NSTimeInterval duration)
    {
        [CATransaction begin];
        [CATransaction setValue:[NSNumber numberWithFloat:duration]
                         forKey:kCATransactionAnimationDuration];
    }

    ~ScopedCAActionSetDuration()
    {
        [CATransaction commit];
    }
};

#endif // UI_BASE_COCOA_ANIMATION_UTILS_H
